/*
 * Universidad del Valle de Guatemala
 * Algoritmos y Estructura de Datos
 * David Hsieh #08225
 */


public class Nodo<E> {

    private int frecuencia ;
    private String codigo;
    private E dato;
    private Nodo izquierdo, derecho;

    public Nodo(int frecuencia, E dato) {
        this.frecuencia = frecuencia;
        this.dato = dato;
    }

    public Nodo(E dato) {
        this.dato = dato;
        this.frecuencia = 1;
    }

    public Nodo() {
        this.frecuencia = 0;
    }

    public int getFrecuencia() {
        return frecuencia;
    }

    public void setFrecuencia(int frecuencia) {
        this.frecuencia = frecuencia;
    }

    public void incFrecuencia() {
        this.frecuencia ++;
    }

    public E getDato() {
        return dato;
    }

    public void setDato(E dato) {
        this.dato = dato;
    }

    public Nodo getIzquierdo() {
        return izquierdo;
    }

    public void setIzquierdo(Nodo izq) {
        izquierdo = izq;
    }

    public Nodo getDerecho() {
        return derecho;
    }

    public void setDerecho(Nodo der) {
        derecho = der;
    }

    public String getCodigo() {
        return codigo;
    }
    
    @Override
    public String toString() {
        return ("" + getDato());
    }

    public void recorrer(Nodo nodo, String cod) {
        if(nodo != null) {
            if(nodo.getDato() != null)
                System.out.println(nodo.getDato() + " : " + nodo.getFrecuencia() +" : " + cod);
            if(nodo.izquierdo != null) {
                codigo = cod + "0";
                nodo.recorrer(nodo.izquierdo, codigo);
                
            }
            if(nodo.derecho != null) {
                codigo = cod + "1";
                nodo.recorrer(nodo.derecho, codigo);

            }
      

        }
    }

    public void recorrer() {
                   
            if(izquierdo != null) {
                codigo = "0";
                recorrer(izquierdo, codigo);

            }
            if(derecho != null) {
                codigo = "1";
                recorrer(derecho, codigo);

            }
       
    }

    


}
